/*
 *  Copyright (C) 2010 Fabien Renaud
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.boc.botv.model;
// Generated Jun 11, 2010 10:44:35 PM by Hibernate Tools 3.2.1.GA

import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * Représente un compte d'argent virtuel du site
 * @author Fabien Renaud
 */
@Entity
@Table(name = "SiteAccount", catalog = "botv")
public class SiteAccount implements java.io.Serializable {

  private Integer id;
  private String name;
  private double balance;
  private Date creationTime;
  private Set<Transaction> transactions = new HashSet<Transaction>(0);

  /**
   * Crée un compte par défaut
   */
  public SiteAccount() {
  }

  /**
   * Crée un compte
   * @param name Nom du compte
   * @param balance Montant disponible sur le compte
   * @param creationTime Date de création du compte
   */
  public SiteAccount(String name, double balance, Date creationTime) {
    this.name = name;
    this.balance = balance;
    this.creationTime = creationTime;
  }

  /**
   * Crée un compte
   * @param name Nom du compte
   * @param balance Montant disponible sur le compte
   * @param creationTime Date de création du compte
   * @param transactions Transactions associées au compte
   */
  public SiteAccount(String name, double balance, Date creationTime, Set<Transaction> transactions) {
    this.name = name;
    this.balance = balance;
    this.creationTime = creationTime;
    this.transactions = transactions;
  }

  /**
   * Obtient l'id du compte
   * @return L'id du compte
   */
  @Id
  @GeneratedValue(strategy = IDENTITY)
  @Column(name = "id", unique = true, nullable = false)
  public Integer getId() {
    return this.id;
  }

  /**
   * Modifie l'id du compte
   * @param id Le nouvel id du compte
   */
  public void setId(Integer id) {
    this.id = id;
  }

  /**
   * Obtient le nom du compte
   * @return Le nom du compte
   */
  @Column(name = "name", nullable = false, length = 32)
  public String getName() {
    return this.name;
  }

  /**
   * Modifie le nom du compte
   * @param name Nouveau nom pour le compte
   */
  public void setName(String name) {
    this.name = name;
  }

  /**
   * Obtient le solde du compte
   * @return Le solde du compte
   */
  @Column(name = "balance", nullable = false, precision = 22, scale = 0)
  public double getBalance() {
    return this.balance;
  }

  /**
   * Modifie le solde du compte
   * @param balance Nouveau solde du compte
   */
  public void setBalance(double balance) {
    this.balance = balance;
  }

  /**
   * Obtient la date de création du compte
   * @return La date de création du compte
   */
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "creationTime", nullable = false, length = 19)
  public Date getCreationTime() {
    return this.creationTime;
  }

  /**
   * Modifie la date de création du compte
   * @param creationTime La nouvelle date de création du compte
   */
  public void setCreationTime(Date creationTime) {
    this.creationTime = creationTime;
  }

  /**
   * Obtient toutes les transactions liées à la base
   * @return Les transactions liées à la base
   */
  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "siteAccount")
  public Set<Transaction> getTransactions() {
    return this.transactions;
  }

  /**
   * Modifie les transactions liées à la base
   * @param transactions Nouvelles transactions liées à la base
   */
  public void setTransactions(Set<Transaction> transactions) {
    this.transactions = transactions;
  }
}
